____ _ _ _ _
| _ \ ___ | |_ (_) _ __ ___ __| | (_) __ _
| |_) | / _ \ | __| | | | '_ \ / _ \ / _| | | | / _ |
| _ < | __/ | |_ | | | |_) | | __/ | (_| | | | | (_| |
|_| \_\ \___| \__| |_| | .__/ \___| \__,_| |_| \__,_|
|_|
- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b
ÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻ
Cache
ââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
top
Cache ([], auch []cite-ref-1[1]) bezeichnet in der Informationstechnik einen schnellen Pufferspeicher, der (wiederholte) Zugriffe auf vergleichsweise langsame Datenspeicher oder aufwendige Neuberechnungen zu vermeiden hilft. Daten, die bereits einmal geladen oder generiert wurden, verbleiben im Cache, so dass sie bei spÀterem Bedarf schneller aus diesem abgerufen werden können. Auch können Daten, die vermutlich bald benötigt werden, vorab vom Hintergrundmedium abgerufen und vorerst im Cache bereitgestellt werden (read-ahead).
Caches können als Hardwarestruktur (beispielsweise als Hauptspeicherchips) oder Softwarestruktur (beispielsweise als temporÀre Dateien oder reservierter Speicherplatz) ausgebildet sein.
Contents
âą Geschichte
âą Randbedingungen
âą Nutzen
âą Cachehierarchie
âą Strategien
âą CachegröĂe
âą Organisation
âą Arbeitsweise
âą Schreibstrategie
âą Cache Flush
âą Sonstiges
âą Beispiele
âą Prozessor-Cache
âą Laufwerks-Cache
âą Software-Caches
âą DNS-Caching
âą Weblinks
âą Einzelnachweise
ââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
Geschichte
Das Konzept eines schnellen Zwischenspeichers, wie es hier beschrieben ist, wurde erstmals im April 1965 von M. V. Wilkes vorgestellt.cite-ref-2[2]
Cache ist ein Lehnwort, das in diesem Zusammenhang vermutlich erstmals bei IBM in Amerika aus dem Französischen entnommen wurde. Zumindest wird es bereits 1973 in einem Aufsatz von K. R. Kaplan, einem Mitarbeiter des Department of Computer Science am Livingston College der Rutgers University in New Jersey, verwendet.cite-ref-3[3] Seinen Ursprung hat es im französischen cache, das eigentlich die Bedeutung Versteck hat.cite-ref-4[4]cite-ref-5[5] Der Name verdeutlicht den Umstand, dass dem Verwender in der Regel der Cache und seine Ersatzfunktion fĂŒr das angesprochene Hintergrundmedium verborgen bleibt. Wer das Hintergrundmedium verwendet, muss GröĂe oder Funktionsweise des Caches prinzipiell nicht kennen, denn der Cache wird nicht direkt angesprochen. Der Verwender âspricht das Hintergrundmedium anâ, stattdessen âantwortetâ jedoch der Cache â genau auf die Art und Weise, wie auch das Hintergrundmedium geantwortet, also Daten geliefert hĂ€tte. Wegen der Unsichtbarkeit dieser zwischengeschalteten Einheit spricht man auch von Transparenz. Praktisch ist er eine gespiegelte Ressource, die stellvertretend fĂŒr das Original sehr schnell reagiert.
Neuere Geschichte
Neben dem Zwischenspeichern von schon benutzten Daten haben moderne Caches die Aufgabe, zukĂŒnftig möglicherweise benötigte Daten schon in den Cache vorzuladen. Dies kann softwareunterstĂŒtzt (PREFETCHT0, PREFETCHT1, PREFETCHT2, PREFETCHNTA) erfolgen (ab 1999/Pentium III) wie auch hardwareunterstĂŒtzt durch Erkennen typischer Zugriffsmuster (ab 2000/Pentium 4).
Randbedingungen
Greifen auĂer dem den Cache verwendenden GerĂ€t noch weitere auf das Hintergrundmedium zu, so kann es zu Inkonsistenzen kommen. Um auf ein identisches Datenabbild zugreifen zu können, ist es notwendig, vor dem Zugriff die Ănderungen des Caches in das Hintergrundmedium zu ĂŒbernehmen. Cachestrategien wie Write-Through oder Write-Back sind hier praktikabel. Im Extremfall muss ein kompletter âCache Flushâ erfolgen.
AuĂerdem muss ggf. der Cache informiert werden, dass sich Daten auf dem Hintergrundmedium geĂ€ndert haben und sein Inhalt nicht mehr gĂŒltig ist (Cache-KohĂ€renz). Stellt die Cachelogik das nicht sicher, so ergibt sich als Nachteil, dass inzwischen im Hintergrundmedium oder im Rechenprogramm erfolgte Ănderungen nicht erkannt werden. Bei Verdacht auf Ănderungen, oder um sicherzugehen, dass der aktuelle Stand berĂŒcksichtigt wird, muss der Benutzer explizit eine Cache-Aktualisierung veranlassen.
Nutzen
Die Ziele beim Einsatz eines Caches sind eine Verringerung der Zugriffszeit und/oder eine Verringerung der Anzahl der Zugriffe auf ein langsames Hintergrundmedium. Das bedeutet insbesondere, dass sich der Einsatz von Caches nur dort lohnt, wo die Zugriffszeit auch signifikanten Einfluss auf die Gesamtleistung hat. WĂ€hrend das z. B. beim Prozessorcache der meisten (skalaren) Mikroprozessoren der Fall ist, trifft es nicht auf Vektorrechner zu, wo die Zugriffszeit eine untergeordnete Rolle spielt. Deswegen wird dort ĂŒblicherweise auf Caches verzichtet, weil diese keinen oder nur wenig Nutzen bringen.
Ein weiterer wichtiger Effekt beim Einsatz von Caches ist die Verringerung der notwendigen DatenĂŒbertragungsrate an die Anbindung des Hintergrundmediums (siehe z. B. Speicherhierarchie); das Hintergrundmedium kann also âlangsamer angebundenâ werden, was z. B. geringere Kosten ergeben kann. Weil oft der GroĂteil der Anfragen vom Cache beantwortet werden kann (âCache Hitâ, s. u.), sinkt die Anzahl der Zugriffe und damit die notwendige DatenĂŒbertragungsrate. Zum Beispiel wĂŒrde ein moderner Mikroprozessor ohne Cache selbst mit sehr kleiner Zugriffszeit des Hauptspeichers dadurch ausgebremst, dass nicht genĂŒgend Speicherbandbreite zur VerfĂŒgung steht, weil durch den Wegfall des Caches die Anzahl der Zugriffe auf den Hauptspeicher und damit die Anforderung an die Speicherbandbreite stark zunehmen wĂŒrde.
Bei CPUs kann der Einsatz von Caches somit zum Verringern des Von-Neumann-Flaschenhalses der Von-Neumann-Architektur beitragen. Die AusfĂŒhrungsgeschwindigkeit von Programmen kann dadurch im Mittel enorm gesteigert werden.
Ein Nachteil von Caches ist das schlecht vorhersagbare Zeitverhalten, da die AusfĂŒhrungszeit eines Zugriffs aufgrund von Cache-Misses nicht immer konstant ist. Sind die Daten nicht im Cache, muss der Zugreifende warten, bis sie von dem langsamen Hintergrundmedium geladen wurden. Bei Prozessoren geschieht das oft bei Zugriffen auf bisher noch nicht verwendete Daten oder beim Laden des nĂ€chsten Programmbefehls bei (weiten) SprĂŒngen.
Cachehierarchie
Da es technisch aufwĂ€ndig und damit meist wirtschaftlich nicht sinnvoll ist, einen Cache zu bauen, der sowohl groĂ als auch schnell ist, kann man mehrere Caches verwenden â z. B. einen kleinen schnellen und einen deutlich gröĂeren, jedoch etwas langsameren Cache (der aber immer noch viel schneller ist als der zu cachende Hintergrundspeicher). Damit kann man die konkurrierenden Ziele von geringer Zugriffszeit und groĂem Cacheumfang gemeinsam realisieren. Das ist wichtig fĂŒr die Hit Rate.
Existieren mehrere Caches, so bilden diese eine Cachehierarchie, die Teil der Speicherhierarchie ist. Die einzelnen Caches werden nach ihrer Hierarchieebene (engl. level) durchnummeriert, also Levelâ1 bis Levelân oder kurz L1, L2 usw. Je niedriger die Nummer, desto nĂ€her liegt der Cache am schnellen âBenutzerâ; die niedrigste Nummer bezeichnet daher den Cache mit der schnellsten Zugriffszeit, dieser wird als erstes durchsucht. EnthĂ€lt der L1-Cache die benötigten Daten nicht, wird der (meist etwas langsamere, aber gröĂere) L2-Cache durchsucht usw. Das geschieht solange, bis die Daten entweder in einer Cacheebene gefunden (ein âCache Hitâ, s. u.) oder alle Caches ohne Erfolg durchsucht wurden (ein âCache Missâ, s. u.). In letzterem Fall muss auf den langsamen Hintergrundspeicher zugegriffen werden.
Tritt ein Cache Hit z. B. im L3-Cache auf, so werden die angeforderten Daten dem Zugreifer geliefert und zugleich in den L1-Cache ĂŒbernommen; dafĂŒr muss dort eine Cache-Line weichen, die in den L2-Cache âabsinktâ.
âą Bei einem inklusiven Cache ist jeder Cache-Level fĂŒr sich transparent, d. h. eine Cache-Line, die im L1-Cache ist, ist auch im L2- und L3-Cache vorhanden. Wird die Cache-Line aus dem L1-Cache âverdrĂ€ngtâ (ĂŒberschrieben mit Daten einer anderen Adresse), so muss sonst nichts unternommen werden â sie ist im L2-Cache ja immer noch vorhanden (sofern kein Write-Back o. Ă. notwendig ist).
âą Bei einem exklusiven Cache ist eine Cache-Line einer Adresse nur einmal in allen Cache-Levels vorhanden. Eine Cache-Line zu Adresse A im L1-Cache ist nicht zusĂ€tzlich im L2- oder L3-Cache vorhanden. Wird sie aus dem L1-Cache verdrĂ€ngt, so kann sie entweder gĂ€nzlich verworfen werden, oder muss explizit in den L2-Cache kopiert werden. Dort wird somit ebenfalls eine (andere) Cache-Line verdrĂ€ngt, um Platz zu machen fĂŒr die absinkende. Diese andere sinkt nun ihrerseits in den L3-Cache, wo somit eine dritte Cache-Line weichen muss.
Exklusive Cache-Hierarchien erzeugen deutlich mehr Datenverkehr zwischen den Caches. DafĂŒr können so viele Cache-Lines bereitgehalten werden wie die Summe von L1-, L2- und L3-Cache-GröĂe, wĂ€hrend beim inklusiven Cache nur die L3-Cache-GröĂe maĂgebend ist.
Im Hardwarebereich weisen vor allem moderne CPUs zwei oder drei Cacheebenen auf; sonstige GerÀte besitzen meist nur eine Cacheebene. Im Softwarebereich wird meist nur eine Cacheebene benutzt, eine prominente Ausnahme bilden Webbrowser, die zwei Ebenen nutzen (Arbeitsspeicher und Festplattenlaufwerk).
Strategien
CachegröĂe
Um den Nutzen des meist um mehrere Zehnerpotenzen kleineren Caches im Vergleich zum Hintergrundspeicher zu maximieren, werden bei der Funktionsweise und Organisation eines Caches die LokalitĂ€tseigenschaften der Zugriffsmuster ausgenutzt. Beobachtet man beispielsweise die AktivitĂ€t eines laufenden Programms auf einem Prozessor ĂŒber ein kurzes Zeitintervall, so stellt man fest, dass wiederholt auf wenige und âimmer dieselbenâ kleinen Speicherbereiche (z. B. Code innerhalb von Schleifen, Steuervariablen, lokale Variablen und Prozedurparameter) zugegriffen wird. Deshalb können bereits kleine Caches mit einigen Kibibytes sehr wirksam sein.
Verarbeitet ein Algorithmus jedoch stĂ€ndig neue Daten (z. B. Streaming-Daten), kann ein Cache keine Beschleunigung durch Mehrfach-Zugriffe bewirken, allenfalls geringfĂŒgig durch read-ahead.
LokalitÀtsausnutzung
Da Caches schnell sein sollen, verwendet man fĂŒr sie meist eine andere (schnellere) Speichertechnologie als fĂŒr den zu cachenden Speicher (zum Beispiel SRAM gegenĂŒber DRAM, DRAM gegenĂŒber Magnetscheibe usw.). Daher sind Caches meist wesentlich teurer in Bezug auf das Preis-Bit-VerhĂ€ltnis, weshalb sie deutlich kleiner ausgelegt werden. Das fĂŒhrt dazu, dass ein Cache nicht alle Daten gleichzeitig vorrĂ€tig haben kann. Um das Problem zu lösen, welche Daten im Cache gehalten werden sollen, werden die LokalitĂ€tseigenschaften der Zugriffe ausgenutzt:
Zeitliche (temporale) LokalitÀt
Da sich Zugriffe auf Daten wiederholen (z. B. beim Abarbeiten einer Programmschleife), ist es eher wahrscheinlich, dass auf Daten, auf die schon einmal zugegriffen wurde, auch noch ein weiteres Mal zugegriffen wird. Diese Daten sollten also bevorzugt im Cache gehalten werden. Dadurch ergibt sich auch die Notwendigkeit, alte Daten, die lange nicht benutzt wurden, aus dem Cache zu entfernen, um Platz fĂŒr neuere zu machen. Diesen Vorgang nennt man âVerdrĂ€ngungâ.
RÀumliche (spatiale) LokalitÀt
Da Programmcode und -daten nicht zufĂ€llig verstreut im Adressraum herumliegen, sondern âhintereinanderâ und teilweise auch nur in bestimmten Adressbereichen angeordnet sind (Code-, Daten-, Stack-Segment, Heap usw.), ist es nach einem Zugriff auf eine bestimmte Adresse wahrscheinlich, dass auch auf eine ânahegelegeneâ Adresse (sprich: Betrag der Differenz der beiden Adressen sehr klein) zugegriffen wird. Bei der Abarbeitung eines Programms wird z. B. ein Befehl nach dem anderen abgearbeitet, wobei diese ânacheinanderâ im Speicher liegen (wenn kein Sprungbefehl dabei ist). Viele Datenstrukturen wie Arrays liegen ebenfalls âhintereinanderâ im Speicher.
Cache-Nutzdaten werden in sogenannten Cache-Lines gespeichert, die in den 1990er Jahren 16 oder 32 Byte groĂ waren und heutzutage 64 oder 128 Bytes groĂ sind. Dies erfolgt aus folgenden GrĂŒnden
âą Pro Cache-Lines werden 5 bis 7 Byte Metadaten benötigt. Daher ist es nicht sinnvoll, fĂŒr jedes Nutzdaten-Byte jeweils 5 bis 7 Byte fĂŒr die Metadaten vorzuhalten.
âą FĂŒr die Implementierung von ECC-RAM sind immer nur Blocks von 8 Byte bis 64 Bytes schreibbar. Das betrifft Server-ECC-RAM wie auch generell Speicher ab DDR5-RAM.
âą Speicher lesen immer Blocks von 64 oder 128 Byte. Einzelne Bytes sind seit DDR1-RAM nicht mehr lesbar.
âą Meist werden ohnehin 8 bis 64 Byte fĂŒr einzelne Lesezugriffe benötigt.
âą Die Wahrscheinlichkeit ist hoch, dass benachbarte Speicherzellen in zeitlich kurzem Abstand ohnehin gelesen werden.
Organisation
Ein Cache besteht aus einer (meist) festen Anzahl EintrÀgen, jeder Eintrag besteht aus:
Cache-Line
Die eigentlichen Daten im Cache (64 bis 128 Byte bei aktuellen PC-Prozessoren)
Address-Tag
höherwertige Adressbits, die sich nicht aus der Position in der Cache-Line und nicht aus dem Mapping im Cache ergeben.cite-ref-6[6]
Dirty-Tags
Welche Daten wurden modifiziert und mĂŒssen zurĂŒckgeschrieben werden? (auĂer Write-Through-Caches)
Valid-Tags
Welche Daten sind in dieser Cache-Line gĂŒltig?
LRU-Tags
Welche Daten wurden am hĂ€ufigsten oder vor kurzem benutzt oder auch nicht? (auĂer Direct Mapped-Cache)
Siehe auch unten #EintrÀge im Cache.
Cache-Line/Cache-Zeile
Eine Cache-Line ist die kleinste Verwaltungseinheit innerhalb des Caches von Prozessoren. Es handelt sich dabei um eine Kopie eines Speicherbereichs. Die Zugriffe vom Cache-Speicher zum Hauptprozessor oder zum Hauptspeicher erfolgen somit in einem einzigen, blockweisen Transfer. Die GröĂe einer Cache-Line betrĂ€gt 16 Bytes (Intel 80486), 32 Bytes (Intel Pentium bis Pentium III) und 64 Bytes (Intel Pentium 4 bis aktuelle Intel-Core-i-/AMD-Ryzen-Prozessoren).cite-ref-0-7-0[7] Die MinimallĂ€nge ergibt sich aus der Speicher-Busbreite multipliziert mit der Prefetch-Tiefe des Hauptspeichers und liegt heutzutage bei 64 oder 128 Bytes.cite-ref-8[8]
Blocknummer-Tags statt Adress-Tags
Im Nachfolgenden wird davon ausgegangen, dass Cache-Lines immer nur von Adressen gelesen und geschrieben werden, deren Adresse durch die (Byte-)LĂ€nge der Cache-Line teilbar ist.
Beispiel
Eine Cache-Line sei 64 Bytes groĂ. Es sei festgelegt, dass Daten nur gelesen und geschrieben werden können mit Startadressen z. B. 0, 64, 128, 192, 256, ... Das Hintergrundmedium ist also aufgeteilt in Blöcke, die gerade so groĂ wie eine Cache-Line sind.
Dann muss in den Adress-Tags nicht mehr die gesamte (Start-)Adresse der Daten gespeichert werden, sondern nur noch, der wievielte Datenblock auf dem Hintergrundmedium gecachet ist. Durch die Wahl passender Zahlen (Zweierpotenzen) im BinĂ€rsystem lassen sich so die Tags platzsparender speichern; das beschleunigt das PrĂŒfen, ob eine angefragte Adresse im Cache enthalten ist.
Block/Satz-Aufteilung der Tags
Die Blöcke (Cache-Lines) eines Caches können in so genannte SĂ€tze zusammengefasst werden. FĂŒr eine bestimmte Adresse ist dann immer nur einer der SĂ€tze zustĂ€ndig. Innerhalb eines Satzes bedienen alle Blöcke also nur einen Teil aller vorhandenen Adressen. Im Folgenden stehe die Variable m {\displaystyle m} fĂŒr die Gesamtanzahl der Cacheblöcke und n {\displaystyle n} fĂŒr die Anzahl der Blöcke pro Satz, die so genannte AssoziativitĂ€t. Dann besteht der Cache also aus m n {\displaystyle {\tfrac {m}{n}}} SĂ€tzen.
| Organisation | Anzahl der SÀtze | AssoziativitÀt |
|---|---|---|
| DM | m {\displaystyle m} | 1 |
| FA | 1 | m {\displaystyle m} ( = n {\displaystyle =n} ) |
| SA | m n {\displaystyle {\tfrac {m}{n}}} | n {\displaystyle n} |
Je nachdem, wie stark man diese Aufteilung vornimmt, spricht man von einer der drei Cache-Organisationsarten:
Direkt abgebildet (engl. direct mapped, kurz DM)
n = 1 {\displaystyle n=1} , d. h., jeder Block reprĂ€sentiert einen eigenen Satz, es gibt also so viele SĂ€tze wie Blöcke. Somit ist fĂŒr eine gegebene Adresse exakt ein Cacheblock zustĂ€ndig. Es existiert also eine direkte Abbildung zwischen Hintergrundspeicheradresse und Cacheblöcken, daher der Name. Bei einer Anfrage an einen solchen Cache muss man nur einen einzelnen Cacheblock auslesen (genauer gesagt den zugehörigen Tag ĂŒberprĂŒfen, s. u.), was den Hardwareaufwand fĂŒr die Tag-Vergleicher minimiert. Im Gegenzug ist die Effizienz des Caches eingeschrĂ€nkt, da möglicherweise freie Cacheblöcke vorhanden sind, die nicht genutzt werden, siehe Conflict Miss unten.
Vollassoziativ (engl. fully associative, kurz FA)
n = m {\displaystyle n=m} , d. h., es gibt nur einen Satz, der alle Blöcke beinhaltet. Somit kann jede Adresse in jedem Cacheblock gecachet werden. Bei einer Anfrage an den Cache ist es daher notwendig, alle Cache-Tags zu ĂŒberprĂŒfen. Da Caches möglichst schnell sein mĂŒssen, wird das parallel ausgefĂŒhrt, was den notwendigen Hardwareaufwand an Tag-Vergleichern vergröĂert. Der Vorteil ist aber, dass der Cache stets Daten aufnehmen kann, solange noch ein beliebiger Cacheblock frei ist.
Satzassoziativ bzw. mengenassoziativ (engl. set associative, kurz SA)
n {\displaystyle n} wird zwischen 2 und m 2 {\displaystyle {\tfrac {m}{2}}} gewĂ€hlt, d. h., die Cacheblöcke sind in SĂ€tzen zu je n {\displaystyle n} Blöcken angeordnet. Hier werden also m n {\displaystyle {\tfrac {m}{n}}} direkt abgebildete Caches vollassoziativ (also frei) angewĂ€hlt. Diesen Cache nennt man dann n-fach satzassoziativ oder kurz n-fach assoziativ. Diese Cacheform stellt einen Kompromiss aus Hardwareaufwand und Effizienz des Caches dar: GegenĂŒber einem DM-Cache gewinnt man Effizienz, gegenĂŒber einem FA-Cache spart man Hardware.
Die ersten beiden sind ein Spezialfall des satzassoziativen Caches. Der direkt abgebildete und der vollassoziative Cache lassen sich somit vom satzassoziativen Cache ableiten: n=1 fĂŒhrt zu einem direkt abgebildeten Cache, n=m zu einem vollassoziativen Cache.
ErklÀrung anhand eines Beispiels
Die wesentlichen GröĂen eines Caches sind:
âą Die GröĂe der gespeicherten Daten (d. h. GröĂe des Caches): hier im Beispiel 64 KiB
âą Die GröĂe des abzudeckenden Adressraumes: hier im Beispiel 4 GiB
âą Die LĂ€nge einer Cache-Zeile: hier im Beispiel 64 Byte
⹠Die GranularitÀt der Daten: hier im Beispiel 1 Byte
âą Vorhandensein von Dirty- und Valid-Tags.
Der Cache besteht, unabhÀngig vom Aufbau, aus 64 KiB/64 Byte = 1024 Cache-Zeilen
Vollassoziativer Cache
| 31 | 30 | 29 | 28 | 27 | 26 | 25 | 24 | 23 | 22 | 21 | 20 | 19 | 18 | 17 | 16 | 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| LĂ€nge Adress-Tag | LĂ€nge Adress-Tag | LĂ€nge Adress-Tag | LĂ€nge Adress-Tag | LĂ€nge Adress-Tag | LĂ€nge Adress-Tag | LĂ€nge Adress-Tag | LĂ€nge Adress-Tag | LĂ€nge Adress-Tag | LĂ€nge Adress-Tag | LĂ€nge Adress-Tag | LĂ€nge Adress-Tag | LĂ€nge Adress-Tag | LĂ€nge Adress-Tag | LĂ€nge Adress-Tag | LĂ€nge Adress-Tag | LĂ€nge Adress-Tag | LĂ€nge Adress-Tag | LĂ€nge Adress-Tag | LĂ€nge Adress-Tag | LĂ€nge Adress-Tag | LĂ€nge Adress-Tag | LĂ€nge Adress-Tag | LĂ€nge Adress-Tag | LĂ€nge Adress-Tag | LĂ€nge Adress-Tag | Byte-Position | Byte-Position | Byte-Position | Byte-Position | Byte-Position | Byte-Position |
Es gibt eine Cache-Gruppe, die alle 1024 Cache-Zeilen umfasst. Jedes Hauptspeicher-Datenwort kann in jeder beliebigen der 1024 Cache-Zeilen der einen Cache-Gruppe gespeichert werden. Es sind 1024 Komparatoren erforderlich, die log2(4 GiB/64 Byte) = log2(4 GiB)-log2(64 Byte) bits = 32-6 = 26 bits vergleichen mĂŒssen. An jeder Cache-Zeile hĂ€ngen diese 26 Bit als Adress-Tag. Hardware-Aufwand:
âą 1024 Komparatoren
âą 1024 Ă 64 Ă 8 bit eigentlicher Cache
âą 1024 Ă 26 bit Adress-Tag
âą 1024 Ă 64 bit Valid-Tags
âą 1024 Ă 64 bit Dirty-Tags
âą 1024 Ă ? bit fĂŒr die LRU-Tags
Direct Mapped-Cache / Einfach- oder nicht assoziativer Cache
| 31 | 30 | 29 | 28 | 27 | 26 | 25 | 24 | 23 | 22 | 21 | 20 | 19 | 18 | 17 | 16 | 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| LĂ€nge Adress-Tag | LĂ€nge Adress-Tag | LĂ€nge Adress-Tag | LĂ€nge Adress-Tag | LĂ€nge Adress-Tag | LĂ€nge Adress-Tag | LĂ€nge Adress-Tag | LĂ€nge Adress-Tag | LĂ€nge Adress-Tag | LĂ€nge Adress-Tag | LĂ€nge Adress-Tag | LĂ€nge Adress-Tag | LĂ€nge Adress-Tag | LĂ€nge Adress-Tag | LĂ€nge Adress-Tag | LĂ€nge Adress-Tag | benutzte Cache-Gruppe | benutzte Cache-Gruppe | benutzte Cache-Gruppe | benutzte Cache-Gruppe | benutzte Cache-Gruppe | benutzte Cache-Gruppe | benutzte Cache-Gruppe | benutzte Cache-Gruppe | benutzte Cache-Gruppe | benutzte Cache-Gruppe | Byte-Position | Byte-Position | Byte-Position | Byte-Position | Byte-Position | Byte-Position |
Es gibt 1024 Cache-Gruppen mit je einer Cache-Zeile. Jedes Hauptspeicher-Datenwort kann nur in dieser zu seiner Adresse gehörenden Cache-Zeile gespeichert werden. Die Cache-Gruppe ergibt sich aus den Bit 15 bis 6 der Adresse. Es ist nur ein Komparator erforderlich, der log2(4 GiB)-log2(64 KiB) bits = 16 bits vergleichen muss. An jeder Cache-Zeile hÀngen diese 16 Bit als Adress-Tag. Hardware-Aufwand:
âą Ein Komparator
âą 1024 Ă 64 Ă 8 bit eigentlicher Cache
âą 1024 Ă 16 bit Adress-Tag
âą 1024 Ă 64 bit Valid-Tags
âą 1024 Ă 64 bit Dirty-Tags
âą Keine LRU-Tags
Zweifach assoziativer Cache
| 31 | 30 | 29 | 28 | 27 | 26 | 25 | 24 | 23 | 22 | 21 | 20 | 19 | 18 | 17 | 16 | 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| LĂ€nge Adress-Tag | LĂ€nge Adress-Tag | LĂ€nge Adress-Tag | LĂ€nge Adress-Tag | LĂ€nge Adress-Tag | LĂ€nge Adress-Tag | LĂ€nge Adress-Tag | LĂ€nge Adress-Tag | LĂ€nge Adress-Tag | LĂ€nge Adress-Tag | LĂ€nge Adress-Tag | LĂ€nge Adress-Tag | LĂ€nge Adress-Tag | LĂ€nge Adress-Tag | LĂ€nge Adress-Tag | LĂ€nge Adress-Tag | LĂ€nge Adress-Tag | benutzte Cache-Gruppe | benutzte Cache-Gruppe | benutzte Cache-Gruppe | benutzte Cache-Gruppe | benutzte Cache-Gruppe | benutzte Cache-Gruppe | benutzte Cache-Gruppe | benutzte Cache-Gruppe | benutzte Cache-Gruppe | Byte-Position | Byte-Position | Byte-Position | Byte-Position | Byte-Position | Byte-Position |
Es gibt 512 Cache-Gruppen mit je zwei Cache-Zeilen. Jedes Hauptspeicher-Datenwort kann in einer der beiden zu seiner Adresse gehörenden Cache-Zeilen gespeichert werden. Die Cache-Gruppe ergibt sich aus den Bit 14 bis 6 der Adresse. Es sind zwei Komparatoren erforderlich, die log2(4 GiB)-log2(64 KiB)+1 bits = 17 bits vergleichen mĂŒssen. An jeder Cache-Zeile hĂ€ngen diese 17 Bit als Adress-Tag. Hardware-Aufwand:
âą Zwei Komparatoren
âą 1024 Ă 64 Ă 8 bit eigentlicher Cache
âą 1024 Ă 17 bit Adress-Tag
âą 1024 Ă 64 bit Valid-Tags
âą 1024 Ă 64 bit Dirty-Tags
âą 1024 Ă 1 bit LRU-Tags
2^n-fach assoziativer Cache
| 31 | 30 | 29 | 28 | 27 | 26 | 25 | 24 | 23 | 22 | 21 | 20 | 19 | 18 | 17 | 16 | 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| LĂ€nge Adress-Tag | LĂ€nge Adress-Tag | LĂ€nge Adress-Tag | LĂ€nge Adress-Tag | LĂ€nge Adress-Tag | LĂ€nge Adress-Tag | LĂ€nge Adress-Tag | LĂ€nge Adress-Tag | LĂ€nge Adress-Tag | LĂ€nge Adress-Tag | LĂ€nge Adress-Tag | LĂ€nge Adress-Tag | LĂ€nge Adress-Tag | LĂ€nge Adress-Tag | LĂ€nge Adress-Tag | LĂ€nge Adress-Tag | LĂ€nge Adress-Tag | LĂ€nge Adress-Tag | benutzte Cache-Gruppe | benutzte Cache-Gruppe | benutzte Cache-Gruppe | benutzte Cache-Gruppe | benutzte Cache-Gruppe | benutzte Cache-Gruppe | benutzte Cache-Gruppe | benutzte Cache-Gruppe | Byte-Position | Byte-Position | Byte-Position | Byte-Position | Byte-Position | Byte-Position |
Es gibt 1024/2^n Cache-Gruppen mit je 2^n Cache-Zeilen. Jedes Hauptspeicher-Datenwort kann in einer der 2^n zu seiner Adresse gehörenden Cache-Zeilen gespeichert werden. Die Cache-Gruppe ergibt sich aus den Bit 15-(n-1) bis 6 der Adresse. Es sind 2^n Komparatoren erforderlich, die log2(4 GiB)-log2(64 KiB)+n bits = 16+(n-1) bits vergleichen mĂŒssen. An jeder Cache-Zeile hĂ€ngen diese 16+(n-1) Bit als Adress-Tag. Hardware-Aufwand:
âą 2^n Komparatoren
âą 1024 Ă 64 Ă 8 bit eigentlicher Cache
âą 1024 Ă (16+n-1) bit Adress-Tag
âą 1024 Ă 64 bit Valid-Tags
âą 1024 Ă 64 bit Dirty-Tags
âą 1024 Ă mehrere bit LRU-Tags
Cache Hits und Misses
Den Vorgang, dass die Daten einer Anfrage an einen Cache in selbigem vorrĂ€tig sind, bezeichnet man als âCache Hitâ (dt. Cachetreffer), den umgekehrten Fall als âCache Missâ (dt. âCache-Verfehlenâ).
Um quantitative MaĂzahlen fĂŒr die Bewertung der Effizienz eines Caches zu erhalten, definiert man zwei GröĂen:
Hit Rate
Die Anzahl der Anfragen, bei denen ein Cache Hit auftrat, geteilt durch die Anzahl der insgesamt an diesen Cache gestellten Anfragen. Wie man aus der Definition leicht sehen kann, liegt diese GröĂe zwischen Null und Eins. Eine Hit Rate von z. B. 0,7 (=70 %) bedeutet, dass bei 70 % aller Anfragen an den Cache dieser die Daten sofort liefern konnte und bei 30 % aller Anfragen passen musste.
Miss Rate
Diese ist analog zur Hit Rate als die Anzahl der Anfragen definiert, bei denen die Daten nicht im Cache vorhanden waren geteilt durch die Anzahl der gesamten Anfragen. Es gilt: Miss Rate = 1 â Hit Rate.
Drei Arten von Cache Misses werden unterschieden:
Capacity
Der Cache ist zu klein. Daten waren im Cache vorrĂ€tig, wurden aber wieder aus ihm entfernt. Erfolgt dann ein erneuter Zugriff auf diese Adresse, so wird dieser Miss als âCapacity Missâ bezeichnet. Abhilfe schafft nur ein gröĂerer Cache.
Conflict
Durch die satzassoziative Organisation (gilt somit auch fĂŒr DM-Caches) ist es möglich, dass in einem Satz nicht mehr genug Platz ist, wĂ€hrend in anderen SĂ€tzen noch freie Cacheblöcke vorhanden sind. Dann muss in dem ĂŒberfĂŒllten Satz ein Block entfernt werden, obwohl der Cache eigentlich noch Platz hat. Wird auf diesen entfernten Block erneut zugegriffen, so bezeichnet man diesen Cache Miss als âConflict Missâ. Abhilfe schafft eine Erhöhung der Cacheblocks pro Satz â also eine Erhöhung der AssoziativitĂ€t. Bei vollassoziativen Caches (welche nur einen Satz haben) gibt es prinzipbedingt keine Conflict Misses.
Compulsory
Als âCompulsory Missâ oder auch âCold Start Missâ bezeichnet man den erstmaligen Zugriff auf eine Adresse, deren Daten sich noch nicht im Cache befinden, und zugleich hat der Cache noch freien Platz. Der Unterschied zu den anderen beides Misses ist der, dass hier keine VerdrĂ€ngung stattfindet, sondern ein Block zum ersten Mal/neu beschrieben wird. Er ist nicht oder nur schwer zu verhindern. Moderne Prozessoren besitzen âPrefetcherâ-Einheiten, die selbstĂ€ndig spekulativ Daten in die Caches laden, wenn dort noch Platz ist. Damit soll die Anzahl der Compulsory Misses verringert werden.
Diese drei Typen bezeichnet man auch kurz als âDie drei Câ. In Multiprozessorsystemen kann beim Einsatz eines Cache-KohĂ€renz-Protokolls vom Typ Write-Invalidate noch ein viertes âCâ hinzukommen, nĂ€mlich ein âCoherency Missâ: Wenn durch das Schreiben eines Prozessors in einen Cacheblock der gleiche Block im Cache eines zweiten Prozessors hinausgeworfen werden muss, so fĂŒhrt der Zugriff des zweiten Prozessors auf eine Adresse, die durch diesen entfernten Cacheblock abgedeckt war, zu einem Coherency Miss.
Arbeitsweise
Bei der Verwaltung des Caches ist es sinnvoll, immer nur die Blöcke im Cache zu halten, auf die auch hÀufig zugegriffen wird. Zu diesem Zweck gibt es verschiedene Ersetzungsstrategien. Eine hÀufig verwendete Variante ist dabei die LRU-Strategie (engl. least recently used), bei welcher immer der Block ausgetauscht wird, auf den am lÀngsten nicht mehr zugegriffen wurde. Moderne Prozessoren (z. B. der AMD Athlon) implementieren meist eine Pseudo-LRU-Ersetzungsstrategie, die fast wie echtes LRU arbeitet, aber leichter in Hardware zu implementieren ist.
VerdrÀngungsstrategien
FIFO (First In First Out)
First In â First Out (FIFO)
Der jeweils Àlteste Eintrag wird verdrÀngt.
Least recently used (LRU)
Der Eintrag, auf den am lÀngsten nicht zugegriffen wurde, wird verdrÀngt.
Dabei (FIFO, LRU) werden jedoch keine vollstĂ€ndigen Zeitstempel gespeichert, die eine relativ lange Integer-Zahl erfordern wĂŒrden. Vielmehr werden wenige Bits verwendet (zwei sind hĂ€ufig, aber auch nur eines ist möglich), um einen Cacheeintrag als mehr oder weniger hĂ€ufig benutzt zu markieren. Die Aktualisierung der Bits erfolgt parallel zu einer VerdrĂ€ngung.
Least frequently used (LFU)
Der am seltensten gelesene Eintrag wird verdrÀngt.
Random
Ein zufÀlliger Eintrag wird verdrÀngt.
CLOCK
Daten werden im Cache in der Reihenfolge des Zugriffs abgelegt. Wenn auf ein Datum zugegriffen wird, wird fĂŒr diesen Cacheblock ein Bit gesetzt. Bei einem Miss wird von vorne nach hinten nach dem ersten Datum ohne gesetztes Bit gesucht, dieses wird ersetzt. Bei allen dabei durchgegangenen Daten wird das Bit gelöscht. Es wird ebenfalls markiert, welches Datum zuletzt in den Cache geladen wurde. Von dort beginnt die Suche nach einem Datum, welches ersetzt werden kann.
Optimal
Das Verfahren von Laszlo Belady, bei dem derjenige Speicherbereich verdrĂ€ngt wird, auf den am lĂ€ngsten nicht zugegriffen werden wird, ist optimal. Es ist allerdings nur dann anwendbar, wenn der komplette Programmablauf im Voraus bekannt ist (d. h., er ist ein so genanntes Offline-Verfahren, im Gegensatz zu FIFO und LRU, die Online-Verfahren sind). Der Programmablauf ist aber fast nie im Voraus bekannt; deshalb kann das optimale Verfahren in der Praxis nicht eingesetzt werden. Allerdings kann der optimale Algorithmus als Vergleich fĂŒr andere Verfahren dienen.
Schreibstrategie
Bei einem Schreibzugriff auf einen Block, der im Cache vorhanden ist, gibt es prinzipiell zwei Möglichkeiten:
ZurĂŒckkopieren (write-back)write-back
Beim Schreiben wird der zu schreibende Datenblock nicht sofort in der nĂ€chsthöheren Speicherebene abgelegt, sondern zunĂ€chst im Cache. Dabei entsteht eine Inkonsistenz zwischen Cache und zu cachendem Speicher. Letzterer enthĂ€lt somit veraltete Information. Erst wenn das Wort aus dem Cache verdrĂ€ngt wird, wird es auch in die nĂ€chsthöhere Speicherebene geschrieben. Dazu bekommt jeder Cacheblock ein sogenanntes Dirty Bit, das anzeigt, ob der Block beim Ersetzen zurĂŒckkopiert werden muss. Das fĂŒhrt bei Speicherzugriff durch andere Prozessoren oder DMA-GerĂ€te zu Problemen, weil diese veraltete Informationen lesen wĂŒrden. Abhilfe schaffen hier Cache-KohĂ€renz-Protokolle wie zum Beispiel MESI fĂŒr Uniform-Memory-Access-Systeme.
DurchgÀngiges Schreiben (write-through)write-through
Der zu schreibende Block wird sofort in der nÀchsthöheren Speicherebene abgelegt. Damit ist die Konsistenz gesichert. Damit der Prozessor nicht jedes Mal warten muss, bis der Block in der nÀchsthöheren Speicherebene (die ja langsamer als der Cache ist) abgelegt ist, benutzt man einen Pufferspeicher (write buffer). Wenn dieser voll lÀuft, muss der Prozessor jedoch anhalten und warten.
Analog zu Obigem gibt es bei einem Schreibzugriff auf einen Block, der nicht im Cache vorhanden ist, prinzipiell ebenso zwei Möglichkeiten:
write-allocate
Wie bei einem normalen Cache Miss wird der Block aus der nĂ€chsthöheren Speicherebene geholt. Die entsprechenden Bytes, die durch den Schreibzugriff geĂ€ndert wurden, werden danach im gerade frisch eingetroffenen Block ĂŒberschrieben.
non-write-allocate
Es wird am Cache vorbei in die nĂ€chsthöhere Speicherebene geschrieben, ohne dass der dazugehörige Block in den Cache geladen wird. Das kann fĂŒr manche Anwendungen Vorteile bringen, bei denen viele geschriebene Daten nie wieder gelesen werden. Durch die Verwendung von non-write-allocate verhindert man das VerdrĂ€ngen von anderen, möglicherweise wichtigen Blöcken und reduziert somit die Miss Rate.
Einige BefehlssÀtze enthalten Befehle, die es dem Programmierer ermöglichen, explizit anzugeben, ob zu schreibende Daten am Cache vorbeizuschreiben sind.
Normalerweise wird entweder die Kombination write-back mit write-allocate oder write-through mit non-write-allocate verwendet. Die erste Kombination hat den Vorteil, dass aufeinander folgende Schreibzugriffe auf denselben Block (LokalitĂ€tsprinzip) komplett im Cache abgewickelt werden (bis auf den ersten Miss). Dies gibt im zweiten Fall keinen Vorteil, da sowieso jeder Schreibzugriff zum Hauptspeicher muss, weshalb die Kombination write-through mit write-allocate eher unĂŒblich ist.cite-ref-9[9]
Cache Flush
Ein Cache Flush (âPufferspeicher-Leerungâ) bewirkt das komplette ZurĂŒckschreiben des Cacheinhaltes in den Hintergrundspeicher. Dabei bleibt der Cacheinhalt meist unangetastet. Ein solches Vorgehen ist nötig, um die Konsistenz zwischen Cache und Hintergrundspeicher wiederherzustellen. Notwendig ist das zum Beispiel immer dann, wenn Daten aus dem Hauptspeicher von externen GerĂ€ten benötigt werden, unter anderem bei Multiprozessor-Kommunikation oder bei der Ăbergabe eines als Ausgabepuffer benutzten Teils des Hauptspeichers an den DMA-Controller.
Sonstiges
EintrÀge im Cache
FĂŒr jeden Cacheblock wird im Cache folgendes gespeichert:
âą Die eigentlichen Daten
âą Der Tag (ein Teil der Adresse)
âą Mehrere Statusbits, wie:
modified bzw. dirty Gibt an, ob dieser Cacheblock geĂ€ndert wurde (nur beim Write-Back-Cache). diverse Statusbits je nach Cache-KohĂ€renz-Protokoll, z. B. je ein Bit fĂŒr:
owner Ăquivalent zu âmodified & sharedâ. Gibt an, dass der Block geĂ€ndert wurde und in anderen Caches vorhanden ist. Der Owner ist dafĂŒr verantwortlich, den Hauptspeicher zu aktualisieren, wenn er den Block aus seinem Cache entfernt. Derjenige Prozessor, der zuletzt auf den Cacheblock schreibt, wird neuer Owner.
exclusive Gibt an, dass der Block nicht geÀndert wurde und in keinem anderen Cache vorhanden ist.
shared Hat teilweise unterschiedliche Bedeutungen: Bei MESI gibt das an, dass der Block nicht geĂ€ndert wurde, aber auch in Caches anderer Prozessoren vorhanden ist (dort ebenso unverĂ€ndert). Bei MOESI bedeutet es nur, dass der Block in anderen Prozessorcaches vorhanden ist. Hier ist auch erlaubt, dass der Block verĂ€ndert wurde, also inkonsistent zum Hauptspeicher ist. In diesem Fall gibt es aber einen âOwnerâ (s. o.), der fĂŒr das Aktualisieren des Hauptspeichers verantwortlich ist.
invalid Zeigt an, ob der Block frei (also mit ungĂŒltigen Daten befĂŒllt) oder belegt (also mit gĂŒltigen Daten befĂŒllt) ist.
HeiĂe und kalte Caches
Ein Cache ist âheiĂâ, wenn er optimal arbeitet, also gefĂŒllt ist und nur wenige Cache Misses hat; ist das nicht der Fall, gilt der Cache als âkaltâ. Nach Inbetriebnahme ist ein Cache zunĂ€chst kalt, da er noch keine Daten enthĂ€lt und hĂ€ufig zeitraubend Daten nachladen muss, und wĂ€rmt sich dann zunehmend auf, da die zwischengelagerten Daten immer mehr den angeforderten entsprechen und weniger Nachladen erforderlich ist. Im Idealzustand werden Datenzugriffe fast ausschlieĂlich aus dem Cache bedient und das Nachladen kann vernachlĂ€ssigt werden.
Beispiele
Prozessor-Cache
Siehe auch
:
Befehlscache
Bei Hauptprozessoren kann der Cache direkt im Prozessor integriert oder extern auf der Hauptplatine (frĂŒher weiter verbreitet, heute eher untypisch) platziert sein. Oft gibt es mehrere Ebenen (Levels), die aufeinander aufbauen. Kleinere Level sind dabei typischerweise schneller, haben aber aus KostengrĂŒnden eine geringere GröĂe. Je nach Ort des Caches arbeitet dieser mit unterschiedlichen Taktfrequenzen: Der L1 (Level 1, am nĂ€chsten an der CPU) ist fast immer direkt im Prozessor (d. h. auf dem Die) integriert und arbeitet daher mit dem vollen Prozessortakt â also u. U. mehreren Gigahertz. Ein externer Cache hingegen wird oft nur mit einigen hundert Megahertz getaktet.
Aktuelle Prozessorarchitekturen (zum Beispiel AMD Zen 4, Intel Ice Lake, IBM Power10)cite-ref-0-7-1[7] besitzen ĂŒberwiegend drei Cache-Level: L1, L2 und L3. GĂ€ngige GröĂen fĂŒr L1-Caches sind 4 bis 320 KiB pro Prozessorkern (meist gibt es einen fĂŒr Daten und einen fĂŒr Befehle), der L2-Cache ist 64 KiB bis 32.768 KiBcite-ref-10[10] (meist ebenfalls pro Kern), der L3-Cache 2 bis 1152 MiBcite-ref-11[11] (fĂŒr alle Kerne gemeinsam). Prozessorcache als Extra-Chip auf der Hauptplatine wird heute nicht mehr gebaut, als Extra-Die im selben Chip-GehĂ€use (siehe Multi-Chip-Modul) nur noch selten.
In jedem Fall ist eine Protokollierung erforderlich, um die KohĂ€renz der Daten (z. B. zwischen Caches und Hauptspeicher) sicherzustellen. Dazu dienen Flags, die einen Speicherbereich (typischerweise eine ganze line von 64 Byte) als âdirtyâ, also geĂ€ndert, markieren (s. o. bei Schreibstrategie). Das Problem verschĂ€rft sich bei mehreren Cache-Levels und mehreren Prozessoren oder Prozessorkernen.
Die Cachekonsistenz ist sowohl bei mehreren aktiven GerÀten auf dem Datenbus als auch bei mehreren zusammengeschalteten Prozessoren (Mehrprozessorsysteme) zu beachten.
Bei Mehrprozessorsystemen unterscheidet man unter anderem nach flynnscher Klassifikation zwischen SIMD- und MIMD-Strukturen (Single/Multiple Instruction â Multiple Data). Bei MIMD-Systemen ist die Wahrscheinlichkeit hoch, dass verschiedene Prozessoren auf verschiedene Speicherbereiche zugreifen, bei SIMD dagegen kleiner. Danach lĂ€sst sich die Cache-Konfiguration einstellen.
Moderne Prozessoren haben getrennte L1-Caches fĂŒr Programme und Daten (Lese- und Schreibcache), teilweise ist das auch noch beim L2 der Fall (Intel Itanium 2). Man spricht hier von einer Harvard-Architektur. Das hat den Vorteil, dass man fĂŒr die unterschiedlichen Zugriffsmuster fĂŒr das Laden von Programmcode und Daten unterschiedliche Cachedesigns verwenden kann. AuĂerdem kann man bei getrennten Caches diese rĂ€umlich besser zu den jeweiligen Einheiten auf dem Prozessor-Die platzieren und damit die kritischen Pfade beim Prozessorlayout verkĂŒrzen. Des Weiteren können Instruktionen und Daten gleichzeitig gelesen/geschrieben werden, wodurch der Von-Neumann-Flaschenhals weiter verringert werden kann. Ein Nachteil ist, dass selbstmodifizierender Code gesondert behandelt werden muss, was seine AusfĂŒhrung stark verlangsamt. Allerdings wird diese Technik aus SicherheitsgrĂŒnden und weil sie oft schwer verstĂ€ndlich, schwer prĂŒfbar und daher nur schlecht zu warten ist, heute ohnehin nur noch sehr selten verwendet.
Laufwerks-Cache
Bei Festplattenlaufwerken befindet sich der Cache auf der Steuerplatine (siehe Festplattencache) oder einer separaten Platine, dem Host-Bus-Adapter.
Die GröĂe betrĂ€gt bei aktuellen Festplatten â je nach vom Hersteller vorgesehenen Einsatzzweck der Festplatte â zwischen 8 und 256 MiB.cite-ref-0-7-2[7]
Die meisten optischen Laufwerke besitzen Caches, um die oft im dreistelligen Millisekundenbereich liegenden Zugriffszeiten und Schwankungen im Datenstrom (z. B. durch Synchronisierungsprobleme) aufzufangen.
Software-Caches
Caches können auch bei Software genutzt werden, dabei ist dasselbe Prinzip wie bei der Hardwareimplementierung gemeint: Daten werden fĂŒr einen schnelleren Zugriff auf ein schnelleres Medium zwischengespeichert.
Beispiele: Festplattencache (vom Betriebssystem verwaltet)
Festplatte â Hauptspeicher
Anwendungsdaten (Memoisation)
Berechnung â Hauptspeicher
Netz â (Festplatte/Arbeitsspeicher)
Datenbank â HTML-Datei (HTTP Caching)
Software-Caches, welche die Festplatte als schnelleres Medium verwenden, werden meist in Form von temporÀren Dateien angelegt.
Man spricht auch von Caching, wenn ein Betriebssystem gewisse Ressourcen â wie z. B. Programmbibliotheken oder Schriftarten â vorerst im Arbeitsspeicher belĂ€sst, obwohl sie nach Ende ihrer Benutzung nicht mehr gebraucht werden. Solange kein Speichermangel herrscht, können sie im Arbeitsspeicher verbleiben, um dann ohne Nachladen von der Festplatte sofort zur VerfĂŒgung zu stehen, wenn sie wieder gebraucht werden. Wenn allerdings die Speicherverwaltung des Betriebssystems einen Speichermangel feststellt, werden diese Ressourcen als erste gelöscht.
Suchmaschinen-Cache
Der Suchmaschinen-Cache ist der Lesecache einer Suchmaschine. Eine Suchmaschine besitzt drei Kernkomponenten:
1. Ein Webcrawler durchsucht das World Wide Web nach neuen oder verÀnderten Webseiten und lÀdt sie (zusÀtzlich) in
2. den Suchmaschinen-Cache, ĂŒber den regelmĂ€Ăig verschiedene Indizes erstellt werden. Ăber diese Indizes sucht
3. ein Suchalgorithmus, der gemÀà einer Benutzeranfrage passende Webseiten finden soll.
Die Inhalte aller Webseiten, die die Suchmaschine als Basisdaten fĂŒr Benutzeranfragen berĂŒcksichtigt, werden im Suchmaschinen-Cache zwischengespeichert. Die Server einer Suchmaschine können nicht fĂŒr jede Abfrage jede Webseite in Echtzeit auf die aktuellsten Inhalte durchsuchen; stattdessen wird in einem Index ĂŒber dem Cache gesucht.
Im Allgemeinen kann ein Webseiten-Betreiber Ănderungen seiner Webseiten an die Suchmaschine melden, dann fragt der Webcrawler die Seite baldmöglichst erneut ab; ansonsten prĂŒft der Webcrawler jede Webseite in regelmĂ€Ăigen AbstĂ€nden â die Cache-Inhalte können also veraltet sein. Eine Webseite kann dem Crawler einen Hinweis geben, wie hĂ€ufig sie sich im Allgemeinen Ă€ndert. Suchmaschinen gehen mit dieser Information mitunter verschieden um.
Die in Deutschland verbreitetste Suchmaschine ist Google; deren Cache-, Indizier- und Suchstrategien wird daher besonders hohes Interesse zuteil. Die Webcrawler-Frequenz, mit der Webseiten geprĂŒft werden, liegt bei Google bei den meisten Webseiten zwischen einer und vier Wochen (â[âŠ] Inhalt wird in der Regel alle 7 Tage aktualisiertâcite-ref-google-cache-12-0[12]). Gemeldete Webseiten untersucht der sogenannte Googlebot.
DNS-Caching
â
Hauptartikel
:
DNS-Caching
Im Domain Name System finden Caches Anwendung, welche die Ergebnisse einer Namensauflösung in einem lokalen Cache vorĂŒbergehend zwischenspeichern. Folgende identische DNS-Anfragen können aus dem Cache bedient werden ohne den Nameserver erneut anfragen zu mĂŒssen, wodurch die Performance erhöht wird. Bei DNS befinden sich in der Regel Namensserver, Cache und Anwendung auf verschiedenen ĂŒber das Internet verbundenen Systemen.
Weblinks
Commons
: Cache
â Sammlung von Bildern, Videos und Audiodateien
Wiktionary: Cache
â BedeutungserklĂ€rungen, Wortherkunft, Synonyme, Ăbersetzungen
âą Artikel ĂŒber CPU-Cache bei arstechnica.com (englisch)
âą Cache und Hauptspeicher Online-Seminar
âą KurzĂŒberblick Cache im Elektronik-Kompendium
Einzelnachweise
cite-note-11. â Cache auf duden.de
cite-note-22. â M. V. Wilkes: Slave Memories and Dynamic Storage Allocation. In: Institute of Electrical and Electronics Engineers (Hrsg.): IEEE Transactions on Electronic Computers. EC-14, April 1965, ISSN 0367-7508, doi:10.1109/PGEC.1965.264263 (englisch).
cite-note-44. â Wörterbuch Französisch. Ăbersetzung: cache. Ăditions Larousse, archiviert vom Original (nicht mehr online verfĂŒgbar) am 28. Januar 2013; abgerufen am 20. November 2018.
cite-note-55. â cache. In: Oxford Learner's Dictionaries. University of Oxford, abgerufen am 9. September 2023 (englisch).
cite-note-66. â Ein 16-fach assoziativer 16 MByte-Cache bei unterstĂŒtzten 128 GByte muss hier z. B. die Adressbits 37 bis 20 (insgesamt 18 bit) speichern.
cite-note-0-77. â Stand: Januar 2024
cite-note-88. â 80486: 16 Byte, ab Pentium: 32 Byte, ab Pentium 4: 64 Byte, Apple M1: 64 und 128 Byte
cite-note-99. â John Hennessy, David Patterson: Computer Architecture. A Quantitative Approach. 4th Edition. Morgan Kaufmann Publishers, ISBN 978-0-12-370490-0 (englisch), S. C-11âC-12
cite-note-1010. â IBMs Telum-Architektur: 128 KB L1-Daten, 128 KByte L1-Befehle, 32 MByte L2, jeweils pro Kern
cite-note-1111. â https://www.techpowerup.com/cpu-specs/epyc-9684x.c3253 EOYC 9684X: 1152 MByte L3
cite-note-google-cache-1212. â âEin kurzer Einblick in die FunktionalitĂ€t des Google-Caches (Memento vom 28. Juli 2017 im Internet Archive)â (Mit Suchfunktion)